/**
*   @file main.h
*   Interface para main.c.
* 	Incluye estructuras y typedefs.
*   Fecha de ultima modificacion 06/11/2007.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <getopt.h>
#include "./imageADT/imageADT.h"
#include "./queueADT/queueADT.h"

/**
*	\typedef ptrFnc
* 	Puntero a funcion que se usa para hacer wrappers
* 	de las funciones de imageADT.
*/
typedef int (*ptrFnc)(imageADT, char *);

/**
*   \struct operationT
*	Estructura de la operacion.
*   @var ptr Puntero a funcion de wrapper de funciones de imageADT.
*   @var opt String con el parametro a usar.
*/
typedef struct{
	ptrFnc ptr;
	char * opt;
}operationT;

/**
*   Vector de estructuras para pasarle a getopt.
*   @param help (h) La ayuda del programa.
* 	@param rotate (r) Rota 90 grados para la izquierda o a la derecha.
* 	@param composition (c) Composicion en colores.
* 	@param mirror (m) Espeja  la imagen hacia la izquierda o a la derecha.
* 	@param interection (i) Intersecta con otra imagen.
* 	@param source (s) Nombre del archivo desde donde se lee la imagen.
* 	@param destination (d) Nombre del archivo donde se deja el resultado.
*/
struct option longOpt[] ={
	{"help", 0, NULL, 'h'},
	{"rotate", 1, NULL,'r'},
	{"composition", 1, NULL, 'c'},								
	{"mirror", 1, NULL, 'm'},
	{"intersection", 1, NULL, 'i'},
	{"source", 1, NULL, 's'},
	{"destination", 1, NULL, 'd'}	};

/**
*	\fn intersection_wrapper
*   Wrapper para llamar a la funcion interseccion de imageADT.
*   @param image imagen a intersectar.
*   @param opt opciones a parsear.
*   @return 0 si falla algo, 1 en caso contrario.
*/
int intersection_wrapper(imageADT image, char * opt);

/**
*  \fn mirror_wrapper
*   Wrapper para llamar a la funcion mirror de imageADT.
*   @param image imagen a espejar.
*   @param opt opciones a parsear.
*   @return 0 si falla algo, 1 en caso contrario.
*/
int mirror_wrapper(imageADT image, char * opt);

/**
*  \fn rotation_wrapper
*   Wrapper para llamar a la funcion rotacion de imageADT.
*   @param image imagen a rotar.
*   @param opt opciones a parsear.
*   @return 0 si falla algo, 1 en caso contrario.
*/
int rotation_wrapper(imageADT image, char * opt);

/**
*   \fn copyString
*   Funcion que copia un string.
*   @param source string a copiar.
*   @return char* Devuelve un puntero a la copia.
*/
char * copyString(char * source);

/**
*   \fn freeQElement
*   Funcion de liberacion para pasarle al queueADT.
*   @param queueE el elemento de la cola.
*/
void freeQElement(void * queueE);

/**
*   \fn copyQElement
*   Funcion de copia para pasarle al queueADT.
*   @param queueE el elemento de la cola.
*   @return void* puntero a la copia del elemento de la cola.
*/
void * copyQElement(void * queueE);

/**
*   \fn usage
*   Funcion que imprime la ayuda del programa.
*   @param prgName Nombre del programa.
*/
void usage(char * prgName);
